/*
 * 18-mar-2007
 */
package futbol.tacticas.concursantes2007.Chuky.chuky.equipo;

import java.awt.Point;
import java.util.ArrayList;

import futbol.General;
import futbol.tacticas.concursantes2007.Chuky.chuky.entrenador.*;
import futbol.tacticas.concursantes2007.Chuky.chuky.futbolista.*;

/**
 * 
 * @author Joan Crosas
 */
public class Delantero07 extends Futbolista {
	private static final int NUMERO = 7;
	private static final int FUERZA = 5;
	private static final Point POSICION_INICIAL = new Point( 145, -48 );
	private static final Point POSICION_ATAQUE = new Point( 98, -35 );
	private static final Point POSICION_DEFENSA = new Point( 64, -50 );

	private Accion accion;
	private Point posicionPreferida;

	/**
	 * @param numero
	 * @param posicionInicial
	 */
	public Delantero07( EntrenadorListener entrenadorListener ) {
		super( NUMERO, FUERZA, POSICION_INICIAL, entrenadorListener );
		posicionPreferida = POSICION_DEFENSA;
	}

	/**
	 * 
	 */
	public void prepararAccion( ArrayList<Futbolista> amigos ) {
		accion = null;

		if( isBalonControlado() ) {

			if( isBalonEncima() && getAnotacion() != null && getAnotacion().getAccion() == Anotacion.ACCION_GOLPEAR_BALON ) {
				Point donde = getAnotacion().getDonde();
				double angulo = General.getAngulo( getPosicion().x, getPosicion().y, donde.x, donde.y );
				accion = new AccionGolpearBalon( this, angulo, 100 );
			}	
			if( accion == null && isBalonEncima() ) {
				accion = accionGol();
			}
			if( accion == null && isBalonEncima() ) {
				accion = accionPase( amigos );
			}
			if( accion == null ) {
				AnalizadorCamino analizadorCamino = new AnalizadorCamino( getPosicion(), new Point( 160, 0 ), getPosicionEnemigos() );
				Camino caminoPorteria = analizadorCamino.analizar();

				Point camino[] = caminoPorteria.getCamino();
				Point irA = getPosicion(); // por si acaso no hubiera ningn
											// camino

				if( camino != null ) {
					int index = 2;
					if( index > camino.length - 1 ) {
						index = camino.length - 1;
					}
					irA = camino[index];
				}

				accion = accionCorrer( irA );
			}

		} else {
			accion = accionCorrer( getPosicionPreferida() );
		}

		// por si las moscas
		if( accion == null ) {
			accion = new AccionCorrer( this, getPosicionPreferida() );
		}
	}

	/**
	 * @param amigos
	 * @return
	 */
	private Accion accionPase( ArrayList<Futbolista> amigos ) {
		Accion accionPase = null;


		AnalizadorPases analizadorPases = new AnalizadorPases( this, amigos );
		analizadorPases.analizar();
		analizadorPases.filtrarPases( true );

		Pase pase = analizadorPases.getMejorPase();

		// si el futbolista se encuentra en apuros despejamos el baln
		// lo mandamos a la posicin mas buena y menos mala
		if( pase == null && getInfoPosicion().getMuyMalo() > 10 ) {
			pase = analizadorPases.getPaseMenosMalo();
		}

		if( pase != null ) {
			accionPase = new AccionGolpearBalon( this, pase.getAngulo(), 100 );
			if( pase.getAnotacion() != null ) {		
				getEntrenadorListener().startAnotacion();
				getEntrenadorListener().addAnotacion( pase.getAnotacion() );
			}
		}

		return accionPase;

	}

	/**
	 * 
	 * @return Si hay la posibilidad de meter gol devuelve la accin de chutar a
	 *         porteria sino devuelve null
	 */
	public Accion accionGol() {
		Accion accion = null;

		/*
		 * buscamos el primer palo
		 */
		Point palo1 = new Point( 160, -27 );
		Point palo2 = new Point( 160, 27 );
		int factor = 1;
		Point posicion = getBalon().getPosicionBalon();

		double distanciaPalo1 = posicion.distance( palo1 );
		double distanciaPalo2 = posicion.distance( palo2 );
		if( distanciaPalo1 > distanciaPalo2 ) {
			palo1 = new Point( 160, 27 );
			palo2 = new Point( 160, -27 );
			factor = -1;
		}
		Point punto = new Point( palo1 );

		double anguloPalo1 = General.getAngulo( posicion.x, posicion.y, punto.x, punto.y );
		if( anguloPalo1 < Math.PI * 3 / 8 || anguloPalo1 > Math.PI * 13 / 8 ) {
			ArrayList<Pase> disparoPorteria = new ArrayList<Pase>();
			/*
			 * dividimos la porteria en 28puntos
			 */
			for( int i = 0; i < 27; i++ ) {
				punto.y += factor * 2;
				
				AnalizadorGolpeBalon analizadorGolpeBalon = new AnalizadorGolpeBalon( this, punto );
				disparoPorteria.add( analizadorGolpeBalon.analizar() );
			}
			
			Pase mejorGolpeBalon = null;
			for( int i = 0; i < disparoPorteria.size(); i++ ) {
				Pase infoGolpeBalon = disparoPorteria.get( i );
				if( infoGolpeBalon.getInfo().getMuyMalo() < 65 ) {
					if( mejorGolpeBalon == null ) {
						mejorGolpeBalon = infoGolpeBalon;
					} else if( infoGolpeBalon.getInfo().getMuyMalo() < mejorGolpeBalon.getInfo().getMuyMalo()) {
						mejorGolpeBalon = infoGolpeBalon;
					}
				}
			}
			
			if( mejorGolpeBalon != null ) {
				accion  = new AccionGolpearBalon( this, mejorGolpeBalon.getAngulo(), 100 );
			}
		}

		return accion;
	}

	public Accion getAccion() {
		return accion;
	}

	public Point getPosicionPreferida() {
		if( getAnotacion() != null && getAnotacion().getAccion() == Anotacion.ACCION_CORRER ) {
			posicionPreferida = getAnotacion().getDonde();

		} else if( getTipoJuego() == Entrenador.ATAQUE && getBalon().getPosicionBalon().x > -20 ) {
			posicionPreferida = POSICION_ATAQUE;

		} else {
			posicionPreferida = POSICION_DEFENSA;

		}
		return posicionPreferida;
	}
	

}
